上回我們使用了基本的單元測試來測試我們建立的方法,由結果可知當我們測試的Case夠多的時候,對於我們方法的測試結果也就會更加的嚴謹,今天我們就嘗試用不同的方式來進行單元測試。
首先我們先建立一個測試用的方法,內容為輸入ID會回傳相對應的名字,語法如下:
public string GetNameByID(int ID)
{
switch (ID)
{
case 1:
return "小明";
case 2:
return "小華";
default:
return "查無此人";
}
}
由此可知,當我們給定ID等於1或2時,會回傳相對應的名字,其他的都是"查無此人",現在我們先以上回的方式建立測試Case,語法如下:
[Fact]
public void Test1()
{
string actual_1 = GetNameByID(1);
string actual_2 = GetNameByID(2);
string actual_3 = GetNameByID(3);
string actual_4 = GetNameByID(4);
string expected_1 = "小明";
string expected_2 = "小華";
string expected_3 = "查無此人";
string expected_4 = "查無此人";
Assert.Equal(expected_1, actual_1);
Assert.Equal(expected_2, actual_2);
Assert.Equal(expected_3, actual_3);
Assert.Equal(expected_4, actual_4);
}
public string GetNameByID(int ID)
{
switch (ID)
{
case 1:
return "小明";
case 2:
return "小華";
default:
return "查無此人";
}
}
完成後一樣可以執行通過,但是這樣寫有一個問題,就是日後我們要新增測試Case時,我們必須去更動測試(關卡)的內容,這有點違背了原則,所以在這裡我們將測試Case上方的[Fact]改為Theory(等同TestCase),並且從上方(InlineData)給定我要測試的參數以及預期結果,而測試Case裡面就用其他參數取代,語法如下:
[Theory]
[InlineData(1, "小明")]
[InlineData(2, "小華")]
[InlineData(3, "查無此人")]
[InlineData(4, "查無此人")]
public void TestCase(int ID, string expected)
{
string actual = GetNameByID(ID);
Assert.Equal(expected, actual);
}
public string GetNameByID(int ID)
{
switch (ID)
{
case 1:
return "小明";
case 2:
return "小華";
default:
return "查無此人";
}
}
這樣的做法有助於我們在程式有變動的時候也能確保測試不變,不過意義上來說,前著是一個測試Case把所有內容跑完,後者是同一個測試Case跑了4組。
更多小知識,我們下次見~~